Decision例如,我可以用空盒子写一些不可能的东西,并将其与 一起使用。
{-# LANGUAGE DataKinds, EmptyCase, LambdaCase, TypeOperators #-}
import Data.Type.Equality
import Data.Void
data X = X1 | X2
f :: X1 :~: X2 -> Void
f = \case {}
-- or
-- f x = case x of {}
Run Code Online (Sandbox Code Playgroud)
有没有办法case通过直接模式匹配参数来编写等效项而不使用直接模式匹配?
f :: X1 :~: X2 -> Void
f ???
Run Code Online (Sandbox Code Playgroud) 当你查看settingin lens-family-corepackage 时,你会发现它的类型是Identical f => ((a -> b) -> s -> t) -> LensLike f s t a b,并且Identical定义为class (Traversable f, Applicative f) => Identical f。
我理解它需要ApplicativeandIdentical因为它使用pureand extract,但我不确定为什么它需要Traversable。
setting :: Identical f => ((a -> b) -> s -> t) -> LensLike f s t a b
setting sec f = pure . sec (extract . f)
Run Code Online (Sandbox Code Playgroud)
我还发现Setter在lens包中 …
我正在使用OS X 10.8.2和Haskell Platform 2012.4.0.0.使用时更新包时cabal install,二进制符号链接不会更新以指向新的二进制版本.我必须手动删除符号链接并重新安装包.cabal install说:
警告:无法在/ Users/thsoft/Library/Haskell/bin中为elm创建符号链接,因为该文件已存在但不受cabal管理.如果您愿意,可以手动为此可执行文件创建符号链接.可执行文件已安装在/Users/thsoft/Library/Haskell/ghc-7.4.1/lib/Elm-0.7/bin/elm
我尝试使用sudo并--symlink-bindir=/Users/thsoft/Library/Haskell/bin明确指定,但没有一个帮助.我怎么能解决这个问题?
我已经按种类X索引了S几个适用于X. 例如,f转换X S1为X S2(但X S1在这个简化的示例中不使用)。
{-# LANGUAGE DataKinds, GADTs, TemplateHaskell, TypeFamilies #-}
import Data.Singletons
import Data.Singletons.Sigma
import Data.Singletons.TH
singletons [d|
data S = S1 | S2 | S3 | S4
|]
data X (s :: S) = X
f :: X S1 -> X S2
f x = X
Run Code Online (Sandbox Code Playgroud)
现在我想定义可能返回X S2或X S3取决于其参数的函数。直接的方法是使用Either.
g1 :: Bool -> X S1 -> Either …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Haskell 中的透镜和棱镜访问嵌套记录:
import Data.Text (Text)
import Control.Lens.TH
data State = State
{ _stDone :: Bool
, _stStep :: StateStep
}
data StateStep
= StatePause
| StateRun
{ _stCounter :: Int
, _stMMistake :: Maybe Text
}
makeLenses ''State
makeLenses ''StateStep
makePrisms ''StateStep
main :: IO ()
main = do
let st = State False $ StateRun 0 Nothing
-- works, but the `_2` seems weird
mMistake = st ^? stStep . _StateStepRun . _2 . _Just
-- why not …Run Code Online (Sandbox Code Playgroud) 我们有以下数据类型:
data Foo1 a = Foo1
data Foo2 a = Foo2 (Foo3 a)
data Foo3 a = C1 (Foo1 a) | C2 Int
Run Code Online (Sandbox Code Playgroud)
现在我们希望能够从Foo1或Int获得Foo3.解决方案可以是使用类型类:
class ToFoo3 a where
toFoo3 :: a -> Foo3 b -- Here start the problems with this phantom type b...
instance ToFoo3 (Foo1 b) where
toFoo3 foo1 = C1 foo1
instance ToFoo3 Int where
toFoo3 int = C2 int
Run Code Online (Sandbox Code Playgroud)
在这里,编译器抱怨(正确!)它不能将b与b1匹配,因为类定义中的Foo3的"b"与实例中的Foo1的"b"不同.
有办法解决这个问题吗?
如何解释第三个结果?为什么返回的列表为空?
>[Just 1, Just 2, Nothing, Just 3]^..folded._Just
[1,2,3]
>"1"^?_Show::Maybe Int
Just 1
>["1", "2", "x"]^..folded._Show :: [Maybe Int]
[]
Run Code Online (Sandbox Code Playgroud)
_Just和_Show是棱镜:
>:t _Just
_Just :: Prism (Maybe a) (Maybe b) a b
>:t _Show
_Show :: (Read a, Show a) => Prism' String a
Run Code Online (Sandbox Code Playgroud)
但_Show并不像我预期的那样工作。[Just 1, Just 2]如何用透镜/棱镜得到结果?当然,我可以使用to readMaybe,但我想我可以使用现有的 prism 而不是 helper to。
我是Haskell的新手,仍然对某些符号感到困惑.
在函数头中,我知道
func :: [Int] -> Int
Run Code Online (Sandbox Code Playgroud)
表示输入是整数列表,输出是整数.
这有什么不同
func :: (Ord a) => [a] -> a
Run Code Online (Sandbox Code Playgroud)
我问,因为它们似乎是相同的,我想知道为什么我们使用不同的符号来表示相同的东西.
我有一个带有名称和浮点数的元组列表。如何返回具有最低浮点值的元组?
例子
[("bob",23),("Alice",32),("Susan",1)]
rtnLowestDist :: [(Name, Float)] -> (Name, Float)
Run Code Online (Sandbox Code Playgroud)
返回 ("Susan",1)