Mô-đun GHC.TypeLits hiện cung cấp natVal
và symbolVal
, cho phép chúng tôi nhận giá trị thời gian chạy từ loại Nat
hoặc Symbol
. Có cách nào để có được giá trị thời gian chạy loại [String]
trong số loại '[Symbol]
không? Tôi không thể nhìn thấy một cách rõ ràng để làm điều này. Tôi có thể nghĩ về một trong đó sử dụng một typeclass với OverlappingInstances
, nhưng có vẻ như GHC nên đã có một chức năng cho việc này.Chuyển đổi loại danh sách cấp thành giá trị
Trả lời
symbolVal
có thể được ánh xạ lên danh sách cấp loại. Để làm như vậy, chúng tôi cần ScopedTypeVariables
và PolyKinds
ngoài DataKinds
và TypeOperators
.
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE PolyKinds #-}
import Data.Proxy
import GHC.TypeLits
Chúng tôi sẽ định nghĩa lớp của các loại (dưới mọi hình thức) mà chúng ta có thể "được một giá trị thời gian chạy của loại [String]
".
class SymbolVals a where
symbolVals :: proxy a -> [String]
Chúng tôi có thể nhận danh sách các chuỗi cho bất kỳ danh sách loại trống nào.
instance SymbolVals '[] where
symbolVals _ = []
Chúng tôi có thể có danh sách các loại nơi chúng tôi có thể nhận chuỗi cho loại đầu tiên và danh sách chuỗi cho phần còn lại.
instance (KnownSymbol h, SymbolVals t) => SymbolVals (h ': t) where
symbolVals _ = symbolVal (Proxy :: Proxy h) : symbolVals (Proxy :: Proxy t)
Ah, rất tốt. Tôi quên rằng đây sẽ không phải là một kịch bản yêu cầu 'OverlappingInstances' vì các loại' '[] 'và' (h': t) 'không trùng lặp. Cảm ơn. –
Tôi khuyên bạn nên sử dụng thư viện singletons
. Bạn có tất cả những gì bạn cần nhưng sử dụng Sing
thay vì Proxy
loại:
$ stack ghci --package singletons
Configuring GHCi with the following packages:
GHCi, version 8.0.1: http://www.haskell.org/ghc/ :? for help
Prelude> :set -XDataKinds
Prelude> import Data.Singletons.Prelude
Prelude Data.Singletons.Prelude> fromSing (sing :: Sing '["a","b"])
["a","b"]
Prelude Data.Singletons.Prelude> :t fromSing (sing :: Sing '["a","b"])
fromSing (sing :: Sing '["a","b"]) :: [String]
- 1. Chuyển đổi danh sách cây thành cấu trúc phân cấp
- 2. Chuyển đổi Danh sách loại cơ sở thành Danh sách loại thừa kế
- 3. chuyển đổi danh sách chuỗi con trăn thành loại
- 4. Chuyển đổi hai danh sách có cùng kích thước thành cặp khóa giá trị trong elixir
- 5. Chuyển đổi Danh sách Scala thành Danh sách với một loại khác
- 6. chuyển đổi Danh sách chung .NET thành F # danh sách
- 7. chuyển đổi danh sách phẳng thành danh sách trong python
- 8. chuyển đổi danh sách chuỗi thành danh sách số nguyên
- 9. Chuyển đổi mảng 2dump thành danh sách các danh sách
- 10. Chuyển đổi bảng băm thành danh sách các cặp (khóa, giá trị) trong OCaml
- 11. Chuyển đổi giá trị được phân cách bằng dấu phẩy thành Danh sách <Long>
- 12. Làm cách nào để chuyển đổi danh sách các giá trị ascii thành chuỗi trong python?
- 13. Chuyển đổi Data.Sequence thành một danh sách?
- 14. Cách chuyển đổi Danh sách thành JavaRDD
- 15. Chuyển đổi danh sách thành mảng. java.lang.ArrayStoreException
- 16. Chuyển đổi danh sách một mục thành số nguyên
- 17. chuyển đổi giá trị kép thành giá trị nhị phân
- 18. Cách sử dụng biểu thức Lambda Java 8 để chuyển đổi Danh sách một loại thành Danh sách loại phụ
- 19. chuyển đổi danh sách các danh sách
- 20. Chuyển đổi giá trị int thành unicode
- 21. Chuyển đổi các giá trị từ điển thành mảng
- 22. Chuyển đổi mảng chuỗi thành Danh sách <string>
- 23. Chuyển đổi danh sách các danh sách thành danh sách các số nguyên
- 24. sử dụng danh sách các giá trị có thể có trong lệnh chuyển đổi
- 25. ASP.Net MVC Chọn Danh sách cho Loại Giá trị
- 26. Nối tiếp danh sách cặp khóa/giá trị thành XML
- 27. Chuyển đổi Danh sách <int> thành chuỗi các giá trị được phân cách bằng dấu phẩy
- 28. Scala - chuyển đổi Danh sách Danh sách thành một Danh sách duy nhất: Danh sách [Danh sách [A]] thành Danh sách [A]
- 29. Chuyển đổi Bản đồ Scala thành Danh sách
- 30. Chuyển đổi danh sách các cặp khóa giá trị sang một số có thể bắt buộc
Bạn có muốn một cái gì đó như 'forall (xs :: [Symbol]) -> HList xs -> [Chuỗi]' hoặc 'forall (xs :: [Biểu tượng]) -> Proxy xs -> [String] '. Trước đây là đơn giản, sau này là hơi ít đơn giản (bạn sẽ cần một ràng buộc loại lớp trên xs). – user2407038
Tôi đang tìm cái sau. Mặc dù tôi rất tò mò muốn xem cách thức trước đây được thực hiện như thế nào (nhưng có vẻ như với tôi loại đó 'HList (xs ::' [Symbol]) 'giống như một danh sách các danh sách). Ngoài ra, tôi chưa bao giờ thấy 'forall' được sử dụng khá như thế. Không phải là một khoảng thời gian sau khi nó định lượng? –