我尝试写一个变体show来处理字符串与其他实例不同Show,不包括"并直接返回字符串.但我不知道怎么做.模式匹配?警卫?我找不到任何关于在任何文件中.
这是我试过的,不编译的:
show_ :: Show a => a -> String
show_ (x :: String) = x
show_ x = show x
Run Code Online (Sandbox Code Playgroud) 我正在树上写一些解析代码.(即斯坦福nlp依赖树)
基本上我有这样的功能:
m :: DepTree -> Logic
m (w, [E "nsubj" nsubj, E "dobj" dobj]) = ...
m (w, [E "nsubj" nsubj, E "prep" prep]) = ...
m (w, [E "nsubj" nsubj]) = ...
m (_, []) = error "No rules apply"
Run Code Online (Sandbox Code Playgroud)
我想要的是,如果节点有一个nsubj和一个dobj边缘出来,则调度到第一个规则.我不在乎它可能有什么.
很明显,我的示例函数不会这样做,因为它要求边以正确的顺序存在,如果存在更多的边,它将不匹配.
一种方法可能是使用警卫来提高表现力,我可以这样做:
m (w, es) | (isJust.lookup "nsubj") es && (isJust.lookup "dobj") es = ...
| ...
| otherwise = error ...
Run Code Online (Sandbox Code Playgroud)
但这更加富有成效,我甚至无法处理目标节点.
是否有一种标准方法可以像我一样在图形上编写模式匹配解析器?或者也许是基于Maybe monad的魔法......?
是否可以a使用pattens匹配/保护写入函数?
{-# LANGUAGE PatternGuards #-}
import Control.Monad.State.Strict(State, gets, runStateT)
data MyState = MyState
{ counter :: Int
} deriving (Show)
a :: State MyState String
a = do
i <- gets counter
case i of
0 -> return "hello"
1 -> return "bye"
run = runStateT a ( MyState{counter=0} )
Run Code Online (Sandbox Code Playgroud)
我试着写a为
a' :: State MyState String
a' | i <- gets counter, i == 0 = return "hello"
Run Code Online (Sandbox Code Playgroud)
但得到了错误:
No instance for (Control.Monad.State.Class.MonadState MyState m0)
arising …Run Code Online (Sandbox Code Playgroud) 有没有办法看到函数的守卫而没有看到源代码?
给出一个示例函数(在Elixir中):
def divide(x, y) when y != 0 do
x / y
end
Run Code Online (Sandbox Code Playgroud)
怎么会弄清楚在没有访问源代码的情况下有一个分区/ 2的守卫,以及如何找到关于该守卫的信息或者后卫对模式匹配的预期?
我正在观看来自Ruby Conf 2014的Chris McCord(Elixir凤凰框架的创建者)的演讲.在演讲中,克里斯正在描述警卫,并且有人问是否有办法检查可以显示该功能的警卫的功能.
这是谈话的问题:
https://www.youtube.com/watch?v=5kYmOyJjGDM&t=5188
视频t =时间后不久就会问这个问题.
我开始编写Haskell代码.我试图用卫兵写一个斐波纳契函数 -
fibo :: (Num z, Ord z) => z -> z
fibo d
| d <= 0 = 0
| d == 1 = 1
| otherwise = fibo (d-1) + fibo (d-2)
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误: -
非法类型签名:'(Num z,Ord z)=> z - > z fibo d'也许您打算在模式类型签名中使用ScopedTypeVariables
然而另一个功能 - 复制我用类似的方式编写,编译和工作正常.我可以用另一种方式写斐波纳契,但我想知道错误是什么
目前我正在尝试通过在线教程学习Haskell来学习Haskell.在"函数中的语法"一章中,作者写道"你也可以使用绑定到模式匹配的地方!".之后有一部分代码示例,但我不知道模式匹配与新的where绑定一起使用的位置.因为代码块的第一部分被缩短了("我们可以将我们之前函数的where部分重写为"),你只能推断它,但我认为我选择了正确的部分.
功能:
bmiTell :: (RealFloat a) => a -> a -> String
bmiTell weight height
| bmi <= skinny = "You're underweight, you emo, you!"
| bmi <= normal = "You're supposedly normal. Pffft, I bet you're ugly!"
| bmi <= fat = "You're fat! Lose some weight, fatty!"
| otherwise = "You're a whale, congratulations!"
where bmi = weight / height ^ 2
skinny = 18.5
normal = 25.0
fat = 30.0
Run Code Online (Sandbox Code Playgroud)
要替换的新where部分:
where bmi = weight …Run Code Online (Sandbox Code Playgroud) 我是Haskell的新手,正在进行模拟棋子的任务.我在确定有条件地检查表达式和更新元组值的正确方法时遇到了一些困难.我有一个名为getPos的函数,它将在板上的特定位置返回Char以确定其状态.
onemove :: (Int,[Char],[[Char]],(Int,Int)) -> (Int,[Char],[[Char]])
onemove (a,b,c,(d,e))
| e <= 0 =(a-30,b,c)
| e > 50 =(a-30,b,c)
| (((posTo == 'r') || (posTo == 'i')) &&((posFrom == 'w')||(posFrom == 'k'))) == 'true' =(a-20,b,c)
| (((posTo == 'w')||(posTo == 'k')) && ((posFrom == 'r') || (posFrom == 'i')))== 'true' =(a-20,b,c)
| otherwise = (1000,b,c)
where posFrom = getPos (d, c)
posTo = getPos (e,c)
Run Code Online (Sandbox Code Playgroud)
使用函数在where子句中定义变量是否正确?我在最后一行收到以下错误:
parse error on input `='
Run Code Online (Sandbox Code Playgroud)